iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0
Rust

30天Rust從零到全端系列 第 2

Day 2: Cargo 詳解 - Rust 專案管理的核心

  • 分享至 

  • xImage
  •  

前言

Hi 大家,昨天我們成功建置了 Rust 開發環境,今天就來深入了解 Cargo——Rust 生態系統的核心工具。Cargo 不只是一個套件管理器,更是一個完整的專案管理解決方案,包含建置系統、測試框架、文件產生器等功能。對於開發者來說,熟練掌握 Cargo 是提升開發效率的關鍵。

但什麼是 Cargo?

Cargo 是 Rust 的官方建置工具和套件管理器,它負責:

  • 建立新專案
  • 管理套件(crates)
  • 編譯程式碼
  • 執行測試
  • 產生文件
  • 發布套件到 crates.io

建立你的第一個 Cargo 專案

建立新專案

使用以下命令建立一個新的 Rust 專案:

cargo new my_first_project
cd my_first_project

這會建立以下的專案結構:

my_first_project/
├── Cargo.toml
├── src/
│   └── main.rs
└── .gitignore

建立函式庫專案

如果要建立函式庫而非執行檔,使用 --lib 參數:

cargo new my_library --lib

Cargo.toml 檔案詳解

Cargo.toml 是專案的設定檔,使用 TOML(Tom's Obvious, Minimal Language)格式:

[package]
name = "my_first_project"
version = "0.1.0"
edition = "2021"
authors = ["你的名字 <your.email@example.com>"]
description = "我的第一個 Rust 專案"
license = "MIT"

[dependencies]
# 這裡放置專案 Dependency

重要欄位說明

  • name: 專案名稱,必須是唯一的
  • version: 遵循語意化版本(Semantic Versioning)
  • edition: Rust 版本,目前建議使用 "2021"
  • dependencies: 外部套件

基本 Cargo 命令

建置專案

# 建置專案(開發版本)
cargo build

# 建置最佳化版本(發布版本)
cargo build --release

執行專案

# 編譯並執行
cargo run

# 執行發布版本
cargo run --release

檢查語法

# 快速檢查程式碼是否能編譯(不產生執行檔)
cargo check

清理建置檔案

# 清理建置產生的檔案
cargo clean

管理套件

新增套件

編輯 Cargo.toml 檔案的 [dependencies] 區段:

[dependencies]
serde = "1.0"
tokio = { version = "1.0", features = ["full"] }
chrono = { version = "0.4", features = ["serde"] }

版本指定方式

[dependencies]
# 精確版本
exact_version = "=1.2.3"

# 相容更新(預設)
compatible = "1.2"

# 波浪號需求(修補更新)
patch_updates = "~1.2.3"

# 插入號需求(相容更新)
minor_updates = "^1.2.3"

# 萬用字元
wildcard = "1.*"

開發套件

只在開發和測試時需要的套件:

[dev-dependencies]
criterion = "0.5"  # 效能測試
proptest = "1.0"   # 屬性測試

實際範例:建立一個簡單的計算機

讓我們建立一個簡單的命令列計算機專案:

1. 建立專案

cargo new simple_calculator
cd simple_calculator

2. 修改 Cargo.toml

[package]
name = "simple_calculator"
version = "0.1.0"
edition = "2021"
authors = ["你的名字 <your.email@example.com>"]
description = "一個簡單的命令列計算機"

[dependencies]

3. 編寫程式碼(src/main.rs)

use std::io;

fn main() {
    println!("=== 簡單計算機 ===");
    println!("請輸入第一個數字:");
    
    let mut input1 = String::new();
    io::stdin().read_line(&mut input1).expect("讀取輸入失敗");
    let num1: f64 = input1.trim().parse().expect("請輸入有效的數字");
    
    println!("請輸入 (+, -, *, /):");
    let mut operator = String::new();
    io::stdin().read_line(&mut operator).expect("讀取輸入失敗");
    let operator = operator.trim();
    
    println!("請輸入第二個數字:");
    let mut input2 = String::new();
    io::stdin().read_line(&mut input2).expect("讀取輸入失敗");
    let num2: f64 = input2.trim().parse().expect("請輸入有效的數字");
    
    let result = match operator {
        "+" => num1 + num2,
        "-" => num1 - num2,
        "*" => num1 * num2,
        "/" => {
            if num2 != 0.0 {
                num1 / num2
            } else {
                println!("錯誤:不能除以零!");
                return;
            }
        }
        _ => {
            println!("錯誤:不支援的運算子!");
            return;
        }
    };
    
    println!("結果:{} {} {} = {}", num1, operator, num2, result);
}

4. 執行專案

cargo run

Cargo 工作區(Workspace)

對於大型專案,可以使用工作區來管理多個相關套件:

建立工作區

建立根目錄的 Cargo.toml

[workspace]
members = [
    "calculator-core",
    "calculator-cli",
    "calculator-web"
]

這樣可以統一管理多個子專案,共享套件和建置設定。

實用的 Cargo 子命令

安裝額外工具

# 程式碼格式化工具
rustup component add rustfmt
cargo fmt

# 程式碼檢查工具
rustup component add clippy
cargo clippy

# 安全性審核工具
cargo install cargo-audit
cargo audit

效能分析

# 安裝 cargo-flamegraph(需要額外設定)
cargo install flamegraph

發布到 crates.io

當你的專案準備好與社群分享時:

# 建立帳號並登入
cargo login

# 發布套件
cargo publish

總結

今天我們深入了解了 Cargo 的核心功能,從基本的專案建立到套件管理,再到實際的計算機專案實作。Cargo 的設計哲學是「約定優於設定」,這意味著遵循標準的專案結構和命名慣例,就能獲得最佳的開發體驗。

今天我們已經掌握了:

  • Cargo 專案的建立和結構
  • Cargo.toml 設定檔的編寫
  • 基本的 Cargo 命令使用
  • 套件的管理方式
  • 一個完整的命令列應用程式實作

明天我們將開始學習 Rust 的基礎語法,包括變數、資料型別和函式定義。這些是所有 Rust 程式的建構基石,掌握了這些概念,你就能開始編寫更複雜的應用程式了。

每一個熟練的 Rust 開發者都是從這些基礎開始的,持續練習是成功的關鍵!


上一篇
Day 1: Rust 開發環境建置 - 踏出系統程式設計的第一步
下一篇
Day 3: Rust 基礎語法 - 變數與資料型別
系列文
30天Rust從零到全端15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言